<?php

class UsuarioController extends Controller {
    /**
     * @final   pacote das views deste controller
     */
    const PACKAGE_VIEW = 'usuario';

    /**
     * @var UsuarioService
     */
    private $usuarioService;
    /**
     * @var FerramentaService
     */
    private $ferramentaService;
    /**
     * @var SetorService
     */
    private $setorService;
    /**
     * @var DepartamentoService
     */
    private $departamentoService;
    /**
     * @var FuncaoService
     */
    private $funcaoService;
    /**
     * @var AtendimentoService
     */
    private $atendimentoService;

    /**
     * __construct
     * Inicializa todos os servicos usuados por UsuarioController
     */
    public function __construct() {
        $this->usuarioService = UsuarioService::getInstance();
        $this->ferramentaService = FerramentaService::getInstance();
        $this->setorService = SetorService::getInstance();
        $this->departamentoService = DepartamentoService::getInstance();
        $this->funcaoService = FuncaoService::getInstance();
        $this->atendimentoService = AtendimentoService::getInstance();
    }

    /**
     * @method  showIndex
     *
     * Exibe a home padrao do sistema
     *
     * @since   Setembro de 2011
     */
    public function showIndex() {
        $this->view('usuario', self::PACKAGE_VIEW);
    }

    /**
     * View que permite o usuario logado editar seus proprios dados
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Outubro de 2011
     */
    public function dados() {
        $this->view('dados', self::PACKAGE_VIEW);
    }

    /**
     * View que permite o usuario logado trocar sua propria senha
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function trocarSenha() {
        $this->view('trocar_senha', self::PACKAGE_VIEW);
    }

    /**
     * @method  preferencias
     *
     * View que permite alterar as preferencias do usuario  e as ferramentas
     * habilitadas, faz o pre-carregamento da lista de ferramentas do sistema
     * utilizando o servico.
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function preferencias() {
        $ArFerramentas = $this->ferramentaService->findAll();
        $this->save(SESSION_INTERFACE, 'ArFerramentas', $ArFerramentas);
        $this->view('preferencias', self::PACKAGE_VIEW);
    }

    /**
     * @method  atribuicoes
     *
     * View que permite ao usuario logado ver suas atribuicoes
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Dezembro de 2011
     */
    public function atribuicoes() {
        $this->view('atribuicoes', self::PACKAGE_VIEW);
    }

    public function relatorios() {
        $Report = $this->atendimentoService->generateReportFromLoggedUser();
        $this->save(SESSION_INTERFACE, 'Report', $Report );
        $this->view('relatorio', self::PACKAGE_VIEW);
    }

    /**
     * @method  editarDados
     *
     * Manipula o post para edicao de dados do usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function editarDados() {
        $ArDados = $_POST;
        $Form = Validator::editarDadosForm($ArDados);

        if( !$Form->validate() ) {
            $this->saveReturn($Form->getFirstError());
        }

        if (!$this->hasReturn()) {
            multipleEntities($ArDados);
            $ArDados['DtNascimento'] = dateBRtoBD($ArDados['DtNascimento']);
            if ($this->usuarioService->updatePessoalData($ArDados)) {
                $this->saveReturn('Usu&aacute;rio atualizado com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao atualizar cadastro', 0);
            }
        }

        $this->showJsonResponse();
    }

    /**
     * @method  editarSenha
     *
     * Manipula o post para edicao de senha do usuario
     *
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     * @since   Novembro de 2011
     */
    public function editarSenha() {
        $Usuario = Dracosys::getLoggedUser();
        $ArDados = $_POST;
        $Form = Validator::editarSenhaForm($ArDados);

        if ( !$Form->validate() ) {
            $this->saveReturn( $Form->getFirstError() );
        }

        if ($Usuario->getArDadosUsuario('StSenha') != $ArDados['StSenhaAntiga']) {
            $this->saveReturn('Sua atual senha não confere com a armazenada');
        } else if ($ArDados['StConfirmacao'] != $ArDados['StNovaSenha']) {
            $this->saveReturn('A confirmação não bate com a senha digitada e avaliada.');
        }

        if (!$this->hasReturn()) {
            if ($this->usuarioService->changePassword($ArDados['StNovaSenha'])) {
                $this->saveReturn('Sua senha foi alterada com sucesso.', 1);
            } else {
                $this->saveReturn('Erro ao trocar sua senha');
            }
        }

        $this->showJsonResponse();
    }

    /**
     * @method  editarPreferencias
     *
     * Manipula o post para atualizacao das ferramentas e preferencias
     *
     * @since   Novembro de 2011
     * @author  Richard Brandao <richardsbrandao@gmail.com>
     */
    public function editarPreferencias() {
        $StMessage = '';
        $ArDados = $_POST;
        $ArPreferencias = array('ItMaximoFerramentas' => $ArDados['ItMaximoFerramentas']);
        $ArFerramentasHabilitadas = explode(', ', $ArDados['IDFerramentas']);
        if (empty($ArDados['ItMaximoFerramentas'])) {
            $this->saveReturn('N&uacute;mero de ferramentas não recebido');
        }
        if (count($ArFerramentasHabilitadas) > $ArDados['ItMaximoFerramentas']) {
            $this->saveReturn('O n&uacute;mero m&aacute;ximo de ferramentas foi excedido.');
        }
        if (empty($StMessage)) {
            multipleEntities($ArDados);
            $BoPreferencias = $this->usuarioService->updatePreferences($ArPreferencias);
            $BoFerramentasHabilitadas = $this->ferramentaService->saveToolsStatus($ArFerramentasHabilitadas);
            if ($BoFerramentasHabilitadas && $BoPreferencias) {
                $this->saveReturn('Atualiza&ccedil;&otilde;es realizadas com sucesso', 1);
            } else {
                $this->saveReturn('Erro ao realizar algumas Atualiza&ccedil;&otilde;es');
            }
        }

        $this->showJsonResponse();
    }

    public function contraCheque() {
        $this->view('contra_cheque', self::PACKAGE_VIEW);
    }

    public function teste() {
        $Post = array(
            'Pessoal' => array(
                'StNome' => 'Ana Cristina dos Santos Brandão',
                'DtNascimento' => '1965-04-24',
                'StCpf' => '787.386.462-69',
                'StRg' => '34358968',
                'StEndereco' => 'Estrada Marechal Mallet',
                'StNumero' => '195',
                'StComplemento' => '',
                'StBairro' => 'Sulacap',
                'StCidade' => 'Rio de Janeiro',
                'StEstado' => 'RJ',
                'StCep' => '21745-091',
                'StEmail' => 'cristina.brandao@eleven.com.br',
                'ItRamal' => '',
                'StDDDTelefone' => '21',
                'StTelefone' => '2301-0156',
                'StDDDCelular' => '21',
                'StCelular' => '9482-3245',
                'EnStatus' => 'ATIVADO'
            ),
            'Administrativo' => array(
                'FoSalario' => '7000.00',
                'StBanco' => 'Itaú',
                'StAgencia' => '20432',
                'StConta' => '9382-4',
                'EnStatus' => 'CONTRATADO',
                'DtAdmissao' => '2011-11-11',
                'DtDemissao' => '',
                'EnEstadoCivil' => 'CASADO',
                'StPis' => '89457983457903',
                'StCertificadoReservista' => '9079486254763',
                'StTituloEleitor' => '985698693'
            ),
            'Funcao' => array(
                'StDepartamento' => '12',
                'IDSetor' => '9',
                'IDFuncao' => '21',
                'IDPerfil' => '17'
            ),
            'Dependente' => array(
                '0_0' => array(
                    'StNomeDependente' => 'Blah',
                    'DtNascimentoDependente' => '22/12/1999',
                    'StGrauParentesco' => 'Filho'
                )
            ),
            'IDUsuario' => 25
        );

        $Form = new MultiFormValidator($Post);

        $Form->addRules( 'StNome', array(
            Rule::create(Rule::REQUIRED, true, 'Nome'),
            Rule::create(Rule::LENGHT, 3, 'Nome')
        ));
        $Form->addRules( 'DtNascimento', array(
            Rule::create(Rule::REQUIRED, true, 'Nascimento'),
            Rule::create(Rule::TYPE, TypeRule::DATE_BD_FORMAT, 'Nascimento')
        ));
        $Form->addRules( 'StCpf', array(
            Rule::create(Rule::REQUIRED, true, 'Cpf'),
            Rule::create(Rule::TYPE, TypeRule::CPF, 'Cpf')
        ));
        $Form->addRule( 'StRg', Rule::create(Rule::REQUIRED, true, 'Rg') );
        $Form->addRule( 'StEndereco', Rule::create(Rule::REQUIRED, true, 'Endereço') );
        $Form->addRules( 'StNumero', array(
            Rule::create(Rule::REQUIRED, true, 'Número'),
            Rule::create(Rule::NUMERIC, true, 'Número')
        ));
        $Form->addRule( 'StBairro', Rule::create(Rule::REQUIRED, true, 'Bairro') );
        $Form->addRule( 'StCidade', Rule::create(Rule::REQUIRED, true, 'Cidade') );
        $Form->addRules( 'StEstado', array(
            Rule::create(Rule::REQUIRED, true, 'Estado'),
            Rule::create(Rule::MATCH, '%[a-zA-z]{2}%', 'Estado')
        ));
        $Form->addRules( 'StCep', array(
            Rule::create(Rule::REQUIRED, true, 'Cep'),
            Rule::create(Rule::TYPE, TypeRule::CEP, 'Cep')
        ));
        $Form->addRules( 'StEmail', array(
            Rule::create(Rule::REQUIRED, true, 'Email'),
            Rule::create(Rule::TYPE, TypeRule::EMAIL, 'Email')
        ));
        $Form->addRule( 'ItRamal', Rule::create(Rule::NUMERIC, true, 'Ramal') );
        $Form->addRules( 'StDDDTelefone', array(
            Rule::create(Rule::REQUIRED, true, 'Ddd Telefone'),
            Rule::create(Rule::NUMERIC, true, 'Ddd Telefone'),
            Rule::create(Rule::MATCH, '%[0-9]{2}%', 'Ddd Telefone')
        ));
        $Form->addRules( 'StTelefone', array(
            Rule::create(Rule::REQUIRED, true, 'Telefone'),
            Rule::create(Rule::TYPE, TypeRule::PHONE, 'Telefone')
        ));
        $Form->addRules( 'StDDDCelular', array(
            Rule::create(Rule::REQUIRED, true, 'Ddd Celular'),
            Rule::create(Rule::NUMERIC, true, 'Ddd Telefone'),
            Rule::create(Rule::MATCH, '%[0-9]{2}%', 'Ddd Telefone')
        ));
        $Form->addRules( 'StCelular', array(
            Rule::create(Rule::REQUIRED, true, 'Celular'),
            Rule::create(Rule::TYPE, TypeRule::PHONE, 'Celular')
        ));
        $Form->addRule( 'EnStatus', Rule::create(Rule::REQUIRED, true, 'Status') );

        $Form->addRules( 'FoSalario', array(
            Rule::create(Rule::REQUIRED, true, 'Salário'),
            Rule::create(Rule::MATCH, '%^[0-9]{1,}\.[0-9]{2}$%', 'Salário')
        ));
        $Form->addRule( 'StBanco', Rule::create(Rule::REQUIRED, true, 'Banco') );
        $Form->addRule( 'StAgencia', Rule::create(Rule::REQUIRED, true, 'Agência') );
        $Form->addRule( 'StConta', Rule::create(Rule::REQUIRED, true, 'Conta') );
        $Form->addRule( 'EnStatus', Rule::create(Rule::REQUIRED, true, 'Status') );
        $Form->addRules( 'DtAdmissao', array(
            Rule::create(Rule::REQUIRED, true, 'Data de Admissão'),
            Rule::create(Rule::TYPE, TypeRule::DATE_BD_FORMAT, 'Data de Admissão')
        ));
        $Form->addRule( 'DtDemissao', Rule::create(Rule::TYPE, TypeRule::DATE_BD_FORMAT, 'Data de Demissão'));
        $Form->addRule( 'EnEstadoCivil', Rule::create(Rule::REQUIRED, true, 'Estado Civil') );
        $Form->addRule( 'StPis', Rule::create(Rule::REQUIRED, true, 'Pis') );
        $Form->addRule( 'StCertificadoReservista', Rule::create(Rule::REQUIRED, true, 'Certificado de Reservista') );
        $Form->addRule( 'StTituloEleitor', Rule::create(Rule::REQUIRED, true, 'Título de Eleitor') );

        $Form->addRules( 'IDSetor', array(
            Rule::create(Rule::REQUIRED, true, 'Setor'),
            Rule::create(Rule::NUMERIC, true, 'Perfil')
        ));
        $Form->addRules( 'IDPerfil', array(
            Rule::create(Rule::REQUIRED, true, 'Perfil'),
            Rule::create(Rule::NUMERIC, true, 'Perfil')
        ));

        $DependentsForm = new MultiFormValidator($Post['Dependente']);
        $DependentsForm->addRules( 'DtNascimentoDependente', array(
            Rule::create(Rule::REQUIRED, true, 'Nascimento do Dependente'),
            Rule::create(Rule::TYPE, TypeRule::DATE_BR_FORMAT, 'Nascimento do Dependente')
        ));
        $DependentsForm->addRules( 'StNomeDependente', array(
            Rule::create(Rule::REQUIRED, true, 'Nascimento do Dependente'),
            Rule::create(Rule::LENGHT, 3, 'Nascimento do Dependente')
        ));
        $DependentsForm->addRule( 'StGrauParentesco', Rule::create(Rule::REQUIRED, true, 'Nascimento do Dependente') );
    }

}

?>
